home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / unixSyscall / fcntl.c < prev    next >
C/C++ Source or Header  |  1992-01-11  |  3KB  |  157 lines

  1. /* 
  2.  * fcntl.c --
  3.  *
  4.  *    Procedure to map the Unix fcntl system call to Sprite.
  5.  *
  6.  * Copyright 1986 Regents of the University of California
  7.  * All rights reserved.
  8.  */
  9.  
  10. #ifndef lint
  11. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/fcntl.c,v 1.3 88/07/29 18:39:23 ouster Exp $ SPRITE (Berkeley)";
  12. #endif not lint
  13.  
  14. #include "sprite.h"
  15. #include "fs.h"
  16.  
  17. #include "compatInt.h"
  18.  
  19. #include <fcntl.h>
  20. #include <stdio.h>
  21.  
  22. /*
  23.  *----------------------------------------------------------------------
  24.  *
  25.  * fcntl --
  26.  *
  27.  *    Procedure to map from Unix fcntl system call to Sprite Fs_IOControl.
  28.  *
  29.  * Results:
  30.  *    a value depending on the command, or
  31.  *      UNIX_SUCCESS     the call was successful, or
  32.  *      UNIX_ERROR       the call was not successful.
  33.  *                        The actual error code stored in errno.
  34.  *
  35.  * Side effects:
  36.  *    Variable.
  37.  *
  38.  *----------------------------------------------------------------------
  39.  */
  40.  
  41. int
  42. fcntl(fd, cmd, arg)
  43.     int fd;        /* File to operate on. */
  44.     int cmd;        /* Type of command. */
  45.     int arg;        /* Optional argument to the command. */
  46. {
  47.     ReturnStatus status;
  48.     int value;
  49.  
  50.     switch (cmd) {
  51.     case F_DUPFD:
  52.         status = Fs_GetNewID(fd, &arg);
  53.         value = arg;
  54.         break;
  55.  
  56.     case F_GETFD:
  57.         status = Fs_IOControl(fd, IOC_GET_FLAGS, 
  58.                 0, (Address) NULL, 
  59.                 sizeof(value), (Address) &value);
  60.         value = (value & IOC_CLOSE_ON_EXEC) ? 1 : 0;
  61.         break;
  62.  
  63.     case F_SETFD:
  64.         value = IOC_CLOSE_ON_EXEC;
  65.         if (arg & 1) {
  66.         status = Fs_IOControl(fd, IOC_SET_BITS, 
  67.                 sizeof(value), (Address) &value,
  68.                 0, (Address) NULL);
  69.         } else {
  70.         status = Fs_IOControl(fd, IOC_CLEAR_BITS, 
  71.                 sizeof(value), (Address) &value,
  72.                 0, (Address) NULL);
  73.         }
  74.         value = UNIX_SUCCESS;
  75.         break;
  76.  
  77.     case F_GETFL:  {
  78.         int temp;
  79.  
  80.         status = Fs_IOControl(fd, IOC_GET_FLAGS, 
  81.                 0, (Address) NULL, 
  82.                 sizeof(temp), (Address) &temp);
  83.         value = 0;
  84.         if (temp & IOC_APPEND) {
  85.             value |= FAPPEND;
  86.         }
  87.         if (temp & IOC_NON_BLOCKING) {
  88.             value |= FNDELAY;
  89.         }
  90.         if (temp & IOC_ASYNCHRONOUS) {
  91.             value |= FASYNC;
  92.         }
  93.         }
  94.         break;
  95.  
  96.     case F_SETFL:
  97.         value = 0;
  98.         if (arg & FAPPEND) {
  99.         value |= IOC_APPEND;
  100.         }
  101.         if (arg & FNDELAY) {
  102.         value |= IOC_NON_BLOCKING;
  103.         }
  104.         if (arg & FASYNC) {
  105.         value |= IOC_ASYNCHRONOUS;
  106.         }
  107.         if (value == 0) {
  108.         status = SUCCESS;
  109.         } else {
  110.         status = Fs_IOControl(fd, IOC_SET_BITS, 
  111.                 sizeof(value), (Address) &value,
  112.                 0, (Address) NULL);
  113.         }
  114.         value = UNIX_SUCCESS;
  115.         break;
  116.  
  117.     case F_GETOWN: {
  118.         Ioc_Owner owner;
  119.  
  120.         status = Fs_IOControl(fd, IOC_GET_OWNER, 
  121.                 0, (Address) NULL,
  122.                 sizeof(owner), (Address) &owner);
  123.         if (owner.procOrFamily == IOC_OWNER_FAMILY) {
  124.             value = -owner.id;
  125.         } else {
  126.             value = owner.id;
  127.         }
  128.         }
  129.         break;
  130.  
  131.     case F_SETOWN: {
  132.         Ioc_Owner owner;
  133.  
  134.         if (arg < 0) {
  135.             owner.id = -arg;
  136.             owner.procOrFamily = IOC_OWNER_FAMILY;
  137.         } else {
  138.             owner.id = arg;
  139.             owner.procOrFamily = IOC_OWNER_PROC;
  140.         }
  141.         status = Fs_IOControl(fd, IOC_SET_OWNER, 
  142.                 sizeof(owner), (Address) &owner,
  143.                 0, (Address) NULL);
  144.         value = UNIX_SUCCESS;
  145.         }
  146.         break;
  147.  
  148.     default:
  149.         break;
  150.     }
  151.     if (status != SUCCESS) {
  152.     errno = Compat_MapCode(status);
  153.     return(UNIX_ERROR);
  154.     } 
  155.     return(value);
  156. }
  157.